/*
 * @(#)Service.java $version 2010. 8. 11
 *
 * Copyright 2007-2010 NHN Corp. All rights Reserved. 
 * NHN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.nhncorp.usf.core.config.runtime;

import java.util.List;

import com.nhncorp.usf.core.service.ServiceType;

/**
 * bo, method와 같은 service내의 요소들을 나타내는 인터페이스
 *
 * @author Web Platform Development Team
 */
public interface Service {
    /**
     * &lt;control&gt; 내의 &lt;bo&gt;, &lt;method&gt;를 구분하기 위해 구현해야함
     *
     * @return boolean &lt;control&gt;에 속해있을 경우 true를 리턴하도록 구현
     */
    boolean isControlBlock();

    /**
     * Sets the control block.
     *
     * @param controllable the new control block
     */
    void setControlBlock(boolean controllable);

    /**
	 * {@link Service} 의 타입을 반환한다
	 * 
	 * @return {@link ServiceType}
	 * */
	ServiceType getServiceType();
	
	/**
	 * 하위의 {@link Service} 를 반환한다.
	 * 
	 * @return 하위의 {@link Service}
	 * */
    List<Service> getServiceInfos();

    /**
     * {@code position} 위치의 하위 {@link Service} 를 반환한다.
     * 
     * @param position 반환할 하위 Service Position
     * @return 하위의 {@link Service}
     */
    Service getServiceInfo(int position);
    
    /**
     * {@code service} 를 하위 Service 로 추가한다.
     * 
     * @param service 추가할 하위 {@link Service}
     * */
    void addServiceInfo(Service service);
    
    /**
     * {@link Service} 의 NodeName 을 반환한다.
     * 
     * @return {@link Service} 의 NodeName
     * */
    String getNodeName();
    
    /**
     * 자신을 포함하고 있는 상위 {@link Service} 를 반환한다. <br/>
     * 상위 {@link Service} 가 없으면 {@code null} 을 리턴한다.
     * 
     * @return 상위 {@link Service}
     * */
    Service getParent();
}
